
package carmadness.model.helpers;

import java.util.*;

/**
 * Kétirányú hozzárendelést lehetővé tevő HashMap.
 * 
 * @author Szelei
 * @version 1.0
 * @created 10-Apr-2010 2:32:37 PM
 */
public class BijectiveHashMap<K, V> extends HashMap<K, V>
{
	private HashMap<V, K> reverse = new HashMap<V, K>();

	/**
	 * Elhelyez egy kulcs-érték párt a HashMap-ben. Ha a kulcshoz már létezett
	 * érték, akkor az le lesz cserélve. Ha az érték már el van tárolva egy
	 * másik kulccsal hivatkozva, akkor nem történik semmi.
	 * 
	 * @param key
	 *            A választott kulcs
	 * 
	 * @param value
	 *            A hozzárendelendő érték
	 * 
	 * @return A korábbi érték, ha volt ilyen kulccsal, vagy null egyébként.
	 *         Akkor is null, ha az érték már szerepel a hozzárendelések között.
	 * 
	 */
	@Override
	public V put( K key, V value )
	{
		if ( !containsValue( value ) )
		{
			reverse.put( value, key );
			return super.put( key, value );
		}
		else
		{
			return null;
		}
	}

	/**
	 * Visszatér az értékhez tartozó kulccsal.
	 * 
	 * @param value
	 *            A keresett érték.
	 * @return Az értékhez tartozó kulcs, vagy null, ha nincs ilyen.
	 */
	public K reverseGet( V value )
	{
		return reverse.get( value );
	}

	/**
	 * Eltávolítja a kulcshoz tartozó értéket.
	 * 
	 * @param key
	 *            A keresendő kulcs.
	 * 
	 * @return A hozzárendelt érték vagy null, ha nem létezett hozzárendelés.
	 */
	@Override
	public V remove( Object key )
	{
		Set<java.util.Map.Entry<V, K>> pairs = reverse.entrySet();
		Map.Entry<V, K> value_key_pair = null;
		Iterator<Map.Entry<V, K>> itr = pairs.iterator();

		while ( itr.hasNext() )
		{
			value_key_pair = itr.next();

			if ( value_key_pair.getValue().equals( key ) )
			{
				reverse.remove( value_key_pair.getKey() );
				return super.remove( key );
			}
		}

		return null;
	}

	/**
	 * Törli az összes hozzárendelést.
	 */
	@Override
	public void clear()
	{
		reverse.clear();
		super.clear();
	}
}
